/*
 * @: 
 * @Version: 1.0
 * @Autor: ziwei
 * @Date: 2021-06-21 15:01:07
 * @LastEditors: ziwei
 * @LastEditTime: 2022-01-25 14:03:34
 */
let {SyncHook} = require('tapable');
let fs = require('fs')
let path = require('path')
const Complication = require('./Complication');

//compiler就是编译大管家 负责整个编译过程，保存整个编译所有的信息
class Compiler{
    constructor(options){
        this.options = options;
        this.hooks = {
            run:new SyncHook(),//开始启动编译 刚刚开始
            emit: new SyncHook(),//会在将要写入文件的时候触发
            done: new SyncHook(),//开始结束编译的时候触发
        }
    }
    //4. 执行Compiler对象的run方法开始编译
    run(callback){
        this.hooks.run.call();//触发run钩子 有插件感兴趣会监听回调
        debugger
        // 5.根据配置中的entry找出入口文件
        this.compile((err,stats)=>{
          for(let filename in stats.assets){
            let filePath = path.join(this.options.output.path,filename);
            fs.writeFileSync(filePath,stats.assets[filename],'utf8')
          }
          callback(err,{
            toJson:()=>stats
          })
        });
        this.hooks.done.call();
        //获取每个入口文件,当入口文件发生变化的时候，执行新的编译
        // Object.values(this.options.entry).forEach(entry=>{
        //   fs.watchFile(entry,()=>this.compile(callback));
        // })
        // Object.values(this.options.entry).forEach(entry=>{
        //   //其实应该是监听当前目录下面所有的文件 watch：true,watchOptions:{ignorePattens:/node_modules/}
        //   fs.watchFile('.',()=>this.compile(callback));
        // })
        // console.log();
        // callback(null,{
        //     toHson(){
        //         return {
        //             files:[]
        //         }
        //     }
        // })
    }
    compile(callback){
      //每次编译都会
        let complication = new Complication(this.options);
        //这个才是编译最核心的方法
        complication.build(callback)
    }
}

module.exports = Compiler;